Deklaration eines Sprachelements mit partieller Adresse in ST

Für die folgenden Sprachelemente kann ein noch nicht festgelegter Speicherort (= eine partielle Adresse) definiert werden:

Syntax
TYPE
   name_1: STRUCT
      name_e1 AT %(I|Q|M)* (* optional_begin *) {OFFSET := value} (* optional_end *) : data-type := initial-value;
      name_e2 AT %(I|Q|M)* (* optional_begin *) {OFFSET := value} (* optional_end *) : data-type := initial-value;
      ...
   END_STRUCT (* optional_begin *) {SIZE := value} (* optional_end *);
END_TYPE
 
VAR | VAR_INPUT | VAR_OUTPUT | VAR_GLOBAL | VAR_TEMP
   name_3, name_4, ..., name_n1 AT %(I|Q|M)* : type := initial-value;              (* Here the variable 'name_n1' is defined with a partial address. *)
   name_5 AT %(I|Q|M)*, name_6 AT %(I|Q|M)*, ... name_n2 : type := initial-value;  (* Here the variables 'name_5' and 'name_6' are defined with a partial address. *)
   ...
END_VAR  
Bedeutung der partiellen Adresse und des Offsets

Mit AT %(I|Q|M)* wird dem Sprachelement eine partielle Adresse zugeordnet. Der Speicherort wird zu einem späteren Zeitpunkt spezifiziert, z.B. in einem Tool zum Adressieren der IOs oder in einem VAR_CONFIG-Abschnitt (für jene Variablen, die mit dem strukturierten Datentyp deklariert sind). Details: Siehe "VAR_CONFIG-Abschnitte im SPS-Objekt deklarieren".

AT %(I|Q|M)* ist eine optionale Angabe für das Sprachelement. Ohne dieser Angabe wird keine partielle Adresse für das Sprachelement definiert. Geben Sie eine partielle Adresse laut diesem Aufbau ein:

 

Zeichen

Bedeutung

1.

%

leitet die Adresse ein

2.

Präfix für Lage

definiert die Lage

 

I

Eingang

 

Q

Ausgang

 

M

Speicher (Memory)

3.

*

noch nicht festgelegter Speicherort
(ersetzt den Präfix für die Größe und die Zahlen, wie diese bei einer vollständigen physikalischen Adresse definiert werden)

Erweiterung zur IEC-Norm

Als Erweiterung zur →IEC-Norm ist es möglich, mehrere Variablen mit einer partiellen Adressen oder mehrere Variablen mit partiellen Adressen in einer Zeile zu deklarieren.

Mit dem optionalen Attribut OFFSET wird ein relativer Bit-Offset nach der Adresse der Struktur definiert. Dieses Attribut wird nur bei Strukturelementen unterstützt.
Beachten Sie:

  1. Der angegebene Offset wird zusätzlich zur Basis-Adresse der Variablen verwendet, die basierend auf dem strukturierten Datentyp deklariert wird.

  2. Das Strukturelement mit der höchsten Endposition +1 wird für die Größe des strukturierten Datentyps verwendet. Falls ein Offset angegeben ist, wird auch dieser berücksichtigt. Die unten angeführten Beispiele geben Ihnen Einblick in die Auswirkung von OFFSET auf die Größe des strukturierten Datentyps.

Erweiterung zur IEC-Norm

Das Attribut OFFSET ist ebenfalls eine Erweiterung zur IEC-Norm.

Das optionale Attribut SIZE für die Bitgröße ist nur für strukturierte Datentypen zulässig. Mit diesem Attribut definieren Sie die Bits, die zwischen IO-Segment und Variabler kopiert werden (siehe das folgende Beispiel für einen strukturierten Datentyp mit unterschiedlichen Strukturelementen und dem "SIZE"-Attribut).
Unabhängig davon, ob bzw. welche Bitgröße definiert ist gilt es zu beachten, dass nur die eigentlichen Bits der Struktur kopiert werden. Falls das Attribut SIZE eine kleinere Größe festlegt, weist eine Meldung darauf hin, dass das Attribut ignoriert wird. Falls das Attribut SIZE eine größere Größe festlegt, wird der Unterschied zwischen der angegebenen Größe und der tatsächlichen Größe übersprungen.

Einschränkungen

  • Neuron Power Engineer unterstützt keine Prüfung, ob die Speicherorte vollständig festgelegt sind.

  • Neuron Power Engineer prüft den Abschnitt der Variable nur bedingt, bei der das Sprachelement mit partiellen Adressen deklariert ist. So ist es möglich, partielle Adressen in den nachfolgend genannten Variablen-Arten zu verwenden und solche Datentypen sogar für alle in Neuron Power Engineer unterstützten Variablen-Arten zu verwenden. Dies steht im Widerspruch zur Forderung der →IEC-Norm (laut Abschnitt "6.5.5.4 Directly represented variables – partly specified using “ * ”"), dass Variablen mit partiellen Adressen nicht als →Eingangsvariablen oder →Ein-/Ausgangsvariablen zu verwenden sind.

  • Die Definition der unvollständigen Speicherorte hat keine Auswirkung auf die Ausführung der Anwendung.

Die Deklaration von partiellen Adressen ist innerhalb dieser Abschnitte möglich:
(Informieren Sie sich in der jeweiligen Beschreibung zum Abschnitt über evtl. zusätzliche Möglichkeiten für die Variable.)

Abschnitt

Die Deklaration des Sprachelements erfolgt als:

VAR ... END_VAR

interne Variable (siehe "Deklaration von internen Variablen")

VAR_INPUT ... END_VAR

Eingangsvariable (siehe "Deklaration von Eingangsvariablen in ST")

VAR_OUTPUT ... END_VAR

Ausgangsvariable (siehe "Deklaration von Ausgangsvariablen in ST")

VAR_GLOBAL ... END_VAR

globale Variable (siehe "Deklaration von externen Variablen in ST")

VAR_TEMP ... END_VAR

temporäre Variable (siehe "Deklaration von temporären Variablen in ST")

TYPE ... END_TYPE (nur bei Strukturelementen)

→strukturierter Datentyp (siehe "Deklaration eines strukturierten Datentyps in ST")

Ein einfaches Beispiel mit "OFFSET"
TYPE
  MyType1 : STRUCT
     Elem1 AT %I* : INT;                 (* assignment of a not yet fully specified input, no offset *)
     Elem2 AT %Q* {OFFSET := 9} : INT;   (* assignment of a not yet fully specified output, offset for 'elem2': 9 *)
     Elem3 : INT;                        (* no assignment of a location *)
  END_STRUCT;
END_TYPE
Komplexere Beispiele mit "OFFSET"
TYPE

  Motion_Out_DataSpeed_Type1 : STRUCT (* The size of the structured data type is: 41 bits *)

    Ready : BOOL; 

    S_Speed_4Byte AT %M* { OFFSET := 8} : SAFEDINT;

    S_Status_ErrStatus : SAFEBOOL; (* This structure element is placed at offset 40. *)

  END_STRUCT;

  Motion_Out_Type : STRUCT (* The size of the structured data type is: 42 bits *)

    DataSpeed : Motion_Out_DataSpeed_Type1;

    Error : BOOL; (* This structure element is placed at offset 41. *)

  END_STRUCT;

  Motion_3Axis_Out_Type : STRUCT (* The size of the structured data type is: 126 bits *)

  (* Without the offset for 'Motion_Out_DataSpeed_Type1', the size would be: 102 bits *)

    Axis : ARRAY [0..2] OF Motion_Out_Type;
  END_STRUCT;

  Motion_Out_DataSpeed_Type2 : STRUCT (* The size of the structured data type is: 28 bits *)

    Ready : BYTE;

    S_Byte AT %M* { OFFSET := 20} : BYTE;

    S_Bool AT %M* { OFFSET := 10} : BOOL;

    S_ByteNext : BYTE; (* This structure element is placed at offset 11. *)

  END_STRUCT;

  Motion_Out_DataSpeed_Type3 : STRUCT (* The size of the structured data type is: 33 bits *)

    Ready : BYTE;

    S_Byte AT %M* { OFFSET := 20} : BYTE;

    S_Bool AT %M* { OFFSET := 24} : BOOL;

    S_ByteNext : BYTE; (* This structure element is placed at offset 25. *)

  END_STRUCT;

  Motion_Out_DataSpeed_Type4 : STRUCT (* The size of the structured data type is: 88 bits *)

    Ready : BOOL;

    S_Byte AT %M* { OFFSET := 80} : BYTE;

    S_Status_ErrStatus AT %M* { OFFSET := 60} : SAFEBOOL;

    S_ByteNext : BYTE; (* This structure element is placed at offset 61. *)

  END_STRUCT;
END_TYPE
Beispiel für einen strukturierten Datentyp mit unterschiedlichen Strukturelementen und dem "SIZE"-Attribut
TYPE

  Motion_Out_DataSpeed_Type1_WS : STRUCT

    Ready : BOOL;

    S_Speed_4Byte AT %M* { OFFSET := 8} : SAFEDINT; (* assignment of a not yet fully specified memory and offset *)

    S_Status_ErrStatus : SAFEBOOL; (* This structure element is placed at offset 40. *)

  END_STRUCT {SIZE := 48};
END_TYPE